package ar.uba.fi.algo3.algoflight.view;

import java.awt.Graphics;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

import fiuba.algo3.titiritero.dibujables.SuperficiePanel;
import fiuba.algo3.titiritero.modelo.ObjetoDibujable;
import fiuba.algo3.titiritero.modelo.ObjetoPosicionable;
import fiuba.algo3.titiritero.modelo.SuperficieDeDibujo;

public class ImagenConRotacion implements ObjetoDibujable {

	private BufferedImage imagen;
	private ObjetoPosicionable posicionable;
	private double rotacion;
	private int modificadorAltura;

	public ImagenConRotacion(URL imagenUrl, ObjetoPosicionable posicionable)
			throws IOException {
		this.posicionable = posicionable;
		this.imagen = ImageIO.read(imagenUrl);
		this.rotacion = 0;
		this.modificadorAltura = 0;
	}

	/**
	 * Setea la rotacion de la imagen en grados
	 * 
	 * @param rotacion
	 *            Rotacion de la imagen en grados
	 */
	public void setRotacion(double rotacion) {
		this.rotacion = rotacion;
	}

	public void setModificadorAlturaImagen(int altura) {
		this.modificadorAltura = altura;
	}

	@Override
	public void dibujar(SuperficieDeDibujo superficieDeDibujo) {

		Graphics grafico = ((SuperficiePanel) superficieDeDibujo).getBuffer();
		AffineTransform at = AffineTransform.getRotateInstance(
				Math.toRadians(-1 * rotacion), imagen.getWidth() / 2,
				imagen.getHeight() / 2);
		RenderingHints rh = new RenderingHints(
				RenderingHints.KEY_INTERPOLATION,
				RenderingHints.VALUE_INTERPOLATION_BILINEAR);

		AffineTransformOp op = new AffineTransformOp(at, rh);

		BufferedImage imagenRot = op.filter(imagen, null);

		grafico.drawImage(imagenRot, posicionable.getX(),
				(modificadorAltura == 0) ? posicionable.getY()
						: modificadorAltura - posicionable.getY(), null);
	}

	public ObjetoPosicionable getPosicionable() {
		return posicionable;
	}

}
